//备注：拷贝代码请加上作者信息
//作者：王海涛
//邮箱：1126471088@qq.com
//版本：V1.0.0
/********************************************************
    说明：
    1、支持手动触发产生中断或停止产生中断。
    2、支持检测或释放中断线路资源。
    3、外部提供中断回调函数。
    4、支持打开或关闭中断线路资源。
**********************************************************/

#ifndef __EXTI_BSP_H__
#define __EXTI_BSP_H__

/*****************************************************/
#include "gd32f4xx.h"
#include "gd32f4xx_exti.h"
#include "../GPIO_BSP/gpio_bsp.h"
/*****************************************************/


/*EXTI枚举*/
typedef enum
{
    Exti_GPIO  = 0,//GPIO
    Exti_Event = 1,//事件
}WHT_EXTI_Type_enum;

/*EXTI触发模式枚举*/
typedef enum
{
    Trigger_Rising         = (uint8_t)EXTI_TRIG_RISING,     //上升沿触发,芯片内部事件均是上升沿哈
    Trigger_Falling        = (uint8_t)EXTI_TRIG_FALLING,    //下降沿触发
    Trigger_Rising_Falling = (uint8_t)EXTI_TRIG_BOTH,       //上升和下降沿触发
}WHT_EXTI_Trigger_enum;

/*EXTI中断模式枚举*/
typedef enum
{
    Mode_Interrupt = EXTI_INTERRUPT,//中断模式
    Mode_Event     = EXTI_EVENT,    //事件模式
}WHT_EXTI_Mode_enum;

/*EXTI中断线枚举*/
typedef enum
{
    Exti_Line_Pin0     = EXTI_0, //任意端口的引脚0
    Exti_Line_Pin1     = EXTI_1, //任意端口的引脚1
    Exti_Line_Pin2     = EXTI_2, //任意端口的引脚2
    Exti_Line_Pin3     = EXTI_3, //任意端口的引脚3
    Exti_Line_Pin4     = EXTI_4, //任意端口的引脚4
    Exti_Line_Pin5     = EXTI_5, //任意端口的引脚5
    Exti_Line_Pin6     = EXTI_6, //任意端口的引脚6
    Exti_Line_Pin7     = EXTI_7, //任意端口的引脚7
    Exti_Line_Pin8     = EXTI_8, //任意端口的引脚8
    Exti_Line_Pin9     = EXTI_9, //任意端口的引脚9
    Exti_Line_Pin10    = EXTI_10,//任意端口的引脚10
    Exti_Line_Pin11    = EXTI_11,//任意端口的引脚11
    Exti_Line_Pin12    = EXTI_12,//任意端口的引脚12
    Exti_Line_Pin13    = EXTI_13,//任意端口的引脚13
    Exti_Line_Pin14    = EXTI_14,//任意端口的引脚14
    Exti_Line_Pin15    = EXTI_15,//任意端口的引脚15

    Exti_Line_LVD      = EXTI_16,//电源监控
    Exti_Line_RTC_Alarm= EXTI_17,//RTC闹钟事件
    Exti_Line_USB_FS   = EXTI_18,//USB FS唤醒事件
    Exti_Line_Ethernet = EXTI_19,//以太网唤醒事件
    Exti_Line_USB_HS   = EXTI_20,//USB HS唤醒事件
    Exti_Line_RTC_Time = EXTI_21,//RTC入侵和时间戳事件
    Exti_Line_RTC_Wakeup=EXTI_22,//RTC唤醒事件
}WHT_EXTI_Line_enum;

/*EXTI中断函数指针结构体*/
typedef void (*WHT_EXTI_BSP_Interrupt_Callback_t)(void);

/*EXTI配置结构体*/
typedef struct
{
    WHT_EXTI_Type_enum Type;                             //类型
    WHT_EXTI_Line_enum Line;                             //线路
    WHT_EXTI_Trigger_enum Trigger;                       //触发沿
    WHT_EXTI_Mode_enum Mode;                             //Interrupt OR Event
    WHT_EXTI_BSP_Interrupt_Callback_t Interrupt_Callback;//Mode选择中断时此处有效
    WHT_GPIO_Port_enum Portx;                            //Type选择GPIO时此处有效
    WHT_GPIO_Pin_enum Pinx;                              //Type选择GPIO时此处有效
}WHT_EXTI_Config_t;

/*EXTI回调函数结构体*/
typedef struct
{
    ErrStatus (*WHT_Register)(const WHT_EXTI_Config_t* config);                      //注册线路已使用返回ERR
    FlagStatus (*WHT_Get_Line_Mutex_State)(const WHT_EXTI_Config_t* config);           //获取此路中断线是否正在使用
    void (*WHT_Clr_Line_Mutex_State)(const WHT_EXTI_Config_t* config);                 //释放此路中断线资源
    void (*WHT_Config)(const WHT_EXTI_Config_t* config);                               //初始化配置中断线路
    void (*WHT_Line_Cmd)(const WHT_EXTI_Config_t* config, ControlStatus state);      //开启或关闭此中断线路
    void (*WHT_Soft_Interrupt)(const WHT_EXTI_Config_t* config, ControlStatus state);//手动控制产生中断或停止
}WHT_EXTI_BSP_t;

/*全局常量*/
extern const WHT_EXTI_BSP_t WHT_EXTI_BSP;

#endif // !__EXTI_BSP_H__
